package com.example.myapplication.ui.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;

import androidx.annotation.Nullable;

import java.util.Random;

public class LineChartView extends View {
    public LineChartView(Context context) {
        super(context);
    }

    public LineChartView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public LineChartView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }


    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        return super.onKeyDown(keyCode, event);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return super.onTouchEvent(event);
    }


    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
    }

    /*
     * View 当此视图应为其每个子项分配大小和位置时从布局调用。有孩子的派生类应该重写这个方法并在他们的每个孩子上调用布局。
     * 参数：changed ——这是此视图的新尺寸或位置 left – 左侧位置，相对于父级 top – 顶部位置，相对于父级 right – 相对于父级的正确位置 bottom – 底部位置，相对于父
     * */
    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
        initPaint();
    }

    private final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);//ANTI_ALIAS_FLAG 抗锯齿
    private final Path path = new Path();

    private void initPaint() {
        stroke();
    }

    //绘制模式改为画线模式
    private void stroke() {
        paint.setColor(Color.RED);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(10f);//设置线条宽度
        paint.setStrokeCap(Paint.Cap.ROUND);//设置线条端点形状

        linePaint.setColor(Color.GRAY);
        linePaint.setStyle(Paint.Style.STROKE);
        linePaint.setTextSize(16f);
        linePaint.setStrokeWidth(5f);//设置线条宽度
    }

    @Override
    protected void onDraw(Canvas canvas) {
        //X轴
//        canvas.drawLine();
        //Y轴
//        canvas.drawLine();

        //每个点,圆心距离x、y轴距离，radius为半径
//        canvas.drawCircle();

//        矩形
//        canvas.drawRect(100, 100, 300, 300, paint);
        //rx 和 ry 是圆角的横向半径和纵向半径。
//        canvas.drawRoundRect(100, 100, 500, 300, 50, 300, paint);

//        点
//        canvas.drawPoint();

//椭圆
//      canvas.drawOval();
        //弧、扇形 startAngle 是弧形的起始角度（x 轴的正向，即正右的方向，是 0 度的位置；顺时针为正角度，逆时针为负角度），sweepAngle 是弧形划过的角度；useCenter 表示是否连接到圆心，如果不连接到圆心，就是弧形，如果连接到圆心，就是扇形
//        canvas.drawArc(100, 100, 300, 300, 0, 90, true, paint);

        //自定义图形 通过描述路径的方式来绘制图形
        //Path 有两类方法，一类是直接描述路径的，另一类是辅助的设置或计算。

        //从当前位置向目标位置画一条直线， x 和 y 是目标位置的坐标。
        // 这两个方法的区别是，lineTo(x, y) 的参数是绝对坐标
//        path.lineTo();
        // rLineTo(x, y) 的参数是相对当前位置的相对坐标 （前缀 r 指的就是 relatively 「相对地」)。
//        path.rLineTo();

//这条二次贝塞尔曲线的起点就是当前位置，而参数中的 x1, y1 和 x2, y2 则分别是控制点和终点的坐标
//        path.quadTo(100, 100, 300, 300);

//可以通过 moveTo(x, y) 或 rMoveTo() 来改变当前位置，从而间接地设置这些方法的起点
//        path.moveTo();

//和 Canvas.drawArc() 比起来，少了一个参数 useCenter，而多了一个参数 forceMoveTo 。
//少了 useCenter ，是因为 arcTo() 只用来画弧形而不画扇形，所以不再需要 useCenter 参数；而多出来的这个 forceMoveTo 参数的意思是，绘制是要「抬一下笔移动过去」，还是「直接拖着笔过去」，区别在于是否留下移动的痕迹
//        path.arcTo();
//path.addArc();//直接使用了 forceMoveTo = true 的简化版 arcTo()

//封闭当前子图形
//        path.close();

//        canvas.drawBitmap();

//        paint.setTextSize(50);
//        canvas.drawText();

//        canvas.drawPath(heart(), paint);
        canvas.drawPath(line(), paint);

        float x = 30;
        float y = random.nextFloat() * 300;
        lastY = y;
        lastX = x;
        canvas.drawPoint(x, y, paint);
        //因为在预览中没有办法进行判断，所以预览时会出现不正确的图形

        for (int i = 2; i < 5; i++) {
            x = 30*i;
            y = random.nextFloat() * 300;
            canvas.drawPoint(x, y, paint);
            canvas.drawText(String.valueOf(i), x, 310, linePaint);
            canvas.drawLine(lastX, lastY, x, y, linePaint);
            lastX = x;
            lastY = y;
        }

    }

    private float lastX = -1;
    private float lastY = -1;

    Paint linePaint = new Paint();
    Random random = new Random();

    private Path line() {
        Path p = new Path();
        p.moveTo(20, 20);
        p.lineTo(20, 300);
        p.rLineTo(300, 0);
        return p;
    }

    private Path heart() {
        Path p = new Path();
        p.addArc(100, 100, 300, 300, -225, 225);
//        p.moveTo(150,150);
        p.arcTo(300, 100, 500, 300, -180, 225, false);
        p.lineTo(300, 445);
        return p;
    }


}
